/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package hyperbeam.Figuras;

import hyperbeam.Estructuras.*;
import java.util.ArrayList;
/**
 *
 * @author Programmer
 */
public class Esfera extends Figura {
    Punto3D Centro;
    double  Radio;
    double  sqrRadio;    

    public Punto3D getCentro() {
        return Centro;
    }

    public double getRadio() {
        return Radio;
    }

    public double getSqrRadio() {
        return sqrRadio;
    }

    public Esfera(Punto3D Centro, double Radio) {
        this.Centro = Centro;
        this.Radio = Radio;
        this.sqrRadio = Math.pow(Radio, 2);
    }

    public Esfera(String idMaterial,Punto3D Centro, double Radio) {
        this.idMaterial = idMaterial;
        this.Centro = Centro;
        this.Radio = Radio;
        this.sqrRadio = Math.pow(Radio, 2);
    }

    public Esfera(double Xc, double Yc, double Zc, double Radio) {
        this.Centro = new Punto3D(Xc, Yc, Zc);
        this.Radio = Radio;
        this.sqrRadio = Math.pow(Radio, 2);
    }

    /**
     * Obtiene las intersecciones con un círculo
     * @param camara
     * @param rayo
     * @return
     */
    public ArrayList<Double> obtenerInterseccion(Punto3D camara, Vector rayo, Punto3D interseccion){
        double a,b,c;
        interseccion.setInvalido();
        a = 1.0;
        b = ((2 * rayo.getX()) * (camara.getX() - Centro.getX())) +
            ((2 * rayo.getY()) * (camara.getY() - Centro.getY())) +
            ((2 * rayo.getZ()) * (camara.getZ() - Centro.getZ()));
        c = Math.pow(camara.getX() - Centro.getX(),2) + Math.pow(camara.getY() - Centro.getY(),2) +
            Math.pow(camara.getZ() - Centro.getZ(),2) - sqrRadio;
        ArrayList<Double> intersecciones = Utilidades.resolverCuadratica(a, b, c);
        interseccion = obtenerIntersecccionEcuacion(camara, rayo, intersecciones);
        return intersecciones;
    }

    /**
     * Obtiene la normal de la  esfera
     * @param puntoInterseccion
     * @return
     */
    public Vector obtenerNormal    (Punto3D puntoInterseccion){
       double X = puntoInterseccion.getX() - Centro.getX();
       double Y = puntoInterseccion.getY() - Centro.getY();
       double Z = puntoInterseccion.getZ() - Centro.getZ();
       Vector normal =  new Vector(X,Y,Z);        
       normal.Normalizar();
       return normal;
    }

    public Vector obtenerReflexion (Punto3D camara, Vector rayo, Punto3D punto){
        return new Vector();
    }
    public Vector obtenerRefraccion(Punto3D camara, Vector rayo, Punto3D punto){
        return new Vector();
    }
}
